查看原文
其他

好玩的数学:快速批量人脸识别、提取和人脸区域的模糊化处理

xwmath 考研竞赛数学 2024-04-26

点“考研竞赛数学可每天“涨姿势”哦!


 

在发布了“好玩的数学:用Mathematica学数学和做数学”免费数学实验在线课程,推送了与软件相关教学、学习、应用推文后,软件的应用引起了很多学友的关注!

 

今天,就学友们提到和关注的一个问题,也是与实际生活相关的问题在这里举个简单的例子演示一下。

 

在很多包含人像脸部的新闻报道中,很多时候希望将出现的人脸特征模糊化,这样的处理,一般在图像数量比较少,并且每个相片中的人脸数量比较少的情况之下,这个操作还是比较简单的。但是,如果照片的数量非常多,每张照片中的人脸数量也比较的多的时候,这个时候处理工作量就非常大了!另外,如果我们在用电脑录制视频的时候,希望将出现视频中的不断移动的人的脸部做实时的模糊化处理,这个就更加麻烦,不好操作。在数学软件Mathematica中,这个实现就非常简单,我们只要编制一个简单的函数,输入几行代码就可以轻松实现了。


一、人脸识别并提取人脸图像

Mathematica中做人脸识别简单,一个内部命令就可以实现:

FindFaces

以边界框列表的形式返回检测到的人脸,每张脸以 {{xmin,ymin},{xmax,ymax}}的矩形区域范围形式给出,多张脸则为一个矩形区域列表(集合). 它的使用格式为:


FindFaces[image,{min,max}]


方框内后面灰色部分参数不添加会按照默认设置找出所有可能的人脸分布区域范围,否则给出像素宽度近似范围在 min 和 max 之间的人脸.

 

1、人脸识别与方形脸部区域提取

输入如下表达式:

img =Import["facetest\\7.png"]

faces =FindFaces[img]

ImageTrim[img,#] & /@ faces


三行表达式的作用分别为:

第一行:导入当前工作文件夹(默认为“我的文档”)下的子文件facetest下的图片文件7.png,并显示结果,显示图像,得到第一个结果;

第二行:获取人脸矩形区域位置列表,即第二个结果,矩形区域的顶点坐标列表;

第三行:提取区域图像。


执行效果如图1,其中区域范围列表仅仅显示了部分。


图1


执行如下表达式则将识别的人脸区域框出来显示。

img=Import["10.png"];

HighlightImage[img,{"Boundary",Blue,Rectangle@@@FindFaces[#]&}]

其中HighlightImage为突出显示. 效果如图2所示。


图2


【注1以上过程在MMA11.2中执行,如果换做11.3版本,可能要将第二个faces赋值的表达式替换为:

faces=({##[[1]],##[[2]]})&/@FindFaces[img]

在11.3版本中FindFaces返回的不再是直接的点坐标列表,而是直接的矩形对象. 后面遇到的操作都一样!框图显示则第二个突出表达式只要输入为:

HighlightImage[img,{"Boundary",Blue,FindFaces[img]}]

就可以得到同样的效果。


【注2并不是所有的人脸都能100%准确检测出,如果有些没有检测出,可以适当对图像进行处理,比如旋转等操作,标记出区域后再做其他操作! 


2、圆形脸部区域提取

除了以方形的方式提出脸部图像,也可以通过定义不同形状的遮罩,这里也就是通过定义黑色图形区域的方式,来通过图像叠加获取其他形状的脸部图像提取。比如图3中的代码与结果演示。


图3

 

二、人脸区域模糊化处理

通过FindFaces获取了图像区域以后,对于图像模糊就非常简单了,就是只要对人脸所在区域进行模糊化处理就可以了。

1、单张图片脸部区域的模糊化

结合上面的过程,编制一个人脸区域模糊化处理的函数。完整表达式如下:

img =Import["facetest\\7.png"];

faces =FindFaces[img];

HighlightImage[img,{{"Blur", 10},

Graphics[{Disk[Mean[##],

     First@Differences[##]/2] & /@faces}]}]

这里采用了HighlightImage突出图像显示的方式来模糊指定的图像区域,其中模糊区域为以获取的脸部图形范围faces中的矩形两定点坐标的平均值位置为圆心,两个坐标的差的一半为半径绘制圆形区域来模糊突出显示。执行表达式与效果如图4所示。


图4


2、批量图片脸部区域的模糊化

下面结合单张图片的模糊化处理表达式,通过编制函数的方式,来一次性导入指定文件夹中的所有图像文件,模糊化脸部图像以后,再存储为相同文件名前面加out前缀的图像文件到与输入文件夹位于同一文件夹下的指定输出文件夹中。

 

假设指定文件夹为当前Mathematica文件保存的文件夹,该文件下有一个存放需要处理的图像的文件夹,名称为inputimg,该文件夹中仅仅包含能被Mathematica识别的格式的图像文件;输出文件位置为与输入文件夹同在一个文件夹的空子文件夹outputimg。


定义模糊处理函数为:

Blurface[dir_]:=Module[{filename,images,faces},

(*定义函数,并定义局部变量*)

SetDirectory[NotebookDirectory[]<>dir];

(*设置当前工作文件夹为图像文件所在文件夹*)

filename=FileNames[];

(*获取当前文件夹中的所有图像文件名*)

images=Import[#]&/@filename;

(*导入所有图像*) 

faces=FindFaces[#]&/@images;

(*获取所有图像的脸部位置*)

Do[Export["..\\outputimg\\out"<>filename[[i]],

(*设置模糊后输出文件的文件名*)

HighlightImage[images[[i]],{{"Blur",10},Graphics[{Disk[Mean[##],

First@Differences[##]/2]&/@faces[[i]]}]}]],{i,1,Length[faces]}]]

(*模糊人脸模糊,其中blur后面的10设置模糊半径,值越小模糊程度约大*)

 

上面表达式中用小括号带星号括起来的部分为注释部分,不影响执行。执行以上表达式后,再输入并执行:

Blurface["inputimg"]

执行后在文件夹中可以看到脸部图像模糊后的图像显示效果。图5为原始图像,图6为模糊半径为10的效果。


图5


图6


图7是则是原始图像与模糊半径分别为5,10,15,25,35的对比效果。 

 图7 


三、摄像头视频人脸区域实时模糊化

如果希望启动的摄像头视频图像中包含的人脸区域做模糊化处理,则可以直接输入如下的表达式:

Dynamic[HighlightImage[

CurrentImage[],{{"Blur",15},

Graphics[Rectangle@@@FindFaces[CurrentImage[],{50,150}]]}]]

执行以上表达式,则自动启动电脑的摄像头,并将摄像头中显示的50到150范围内的脸部区域做模糊化处理,而其他区域不发生改变,当摄像头中显示的图像有几个人的脸部区域时,则一并全部做模糊化处理。执行效果如图8所示。


图8


如果去掉参数“{"Blur", 15},”,并将突出显示命令添加参数为边界方式显示,如输入

Dynamic[HighlightImage[

CurrentImage[],

Graphics[Rectangle@@@FindFaces[CurrentImage[],{50,150}]],Method->"Boundary"]]

则只是将脸部区域实时框出来,而不进行模糊化处理,效果如图9所示.


图9


【注】后面两幅图片只做效果演示,来自Mathematica自带帮助文档,不是真实图像抓取。实际效果自行检验。


点击“阅读原文”可以直接打开“好玩的数学:用Mathematica学数学和做数学”免费数学实验在线课程查看Mathematica软件使用基本操作方法和相关资源介绍。

相关推荐

微信公众号:考研竞赛数学(ID: xwmath) 大学数学公共基础课程分享交流平台!支持本号请点赞分享

↓↓↓阅读原文查看更多相关内容

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存